package com.tom.joke;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.Toast;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import com.frame.library.BaseSkinActivity;
import com.frame.library.DefaultNavigationBar;
import com.frame.library.http.HttpCallback;
import com.frame.library.db.DaoSupportFactory;
import com.frame.library.db.IDaoSupport;
import com.frame.library.http.OkHttpEngine;
import com.frame.library.skin.SkinManager;
import com.frame.library.skin.SkinResource;
import com.tom.baselibrary.ExceptionCrashHandler;
import com.tom.baselibrary.dialog.AlertDialog;
import com.tom.baselibrary.fixBug.FixDexManager;
import com.tom.baselibrary.http.HttpUtils;
import com.tom.baselibrary.ioc.OnClick;
import com.tom.baselibrary.ioc.ViewById;
import com.tom.joke.activity.selectimg.SelectImageActivity;
import com.tom.joke.fragment.FindFragment;
import com.tom.joke.fragment.FragmentManagerHelper;
import com.tom.joke.fragment.HomeFragment;
import com.tom.joke.fragment.MessageFragment;
import com.tom.joke.fragment.NewFragment;
import com.tom.joke.model.DiscoverListResult;
import com.tom.joke.model.Person;
import com.tom.joke.permission.PermissionFail;
import com.tom.joke.permission.PermissionHelper;
import com.tom.joke.permission.PermissionSuccess;
import com.tom.joke.permission.PermissionUtils;
import com.tom.joke.view.banner.BannerView;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * View layoutView = View.inflate(this, R.layout.activity_main, null);
 * layoutView = LayoutInflater.from(this).inflate(R.layout.activity_main, null);
 * layoutView = LayoutInflater.from(this).inflate(R.layout.activity_main, null, false);
 */
public class MainActivity extends BaseSkinActivity {
    private static final String TAG = "MainActivity";

    private HomeFragment mHomeFragment;
    private FindFragment mFindFragment;
    private NewFragment mNewFragment;
    private MessageFragment mMessageFragment;
    private FragmentManagerHelper mFragmentHelper;


    // 注入view，替代findViewById
    @ViewById(R.id.find_rb)
    private RadioButton mFindRadioButton;




    //region 底部tab点击事件
    private void initDefaultTab() {
        mFragmentHelper = new FragmentManagerHelper(getSupportFragmentManager(), R.id.main_tab_fl);
//        mHomeFragment = new HomeFragment();
//        mFragmentHelper.add(mHomeFragment);
        mFindRadioButton.performClick(); // 默认显示发现页面。

       /* // 加载第一个Fragment, 兼容API 11 以下的版本。
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        mHomeFragment = new HomeFragment();
        fragmentTransaction.add(R.id.main_tab_fl, mHomeFragment);
        fragmentTransaction.commit();*/
    }

    @OnClick(R.id.home_rb)  // 点击事件监听
    private void homeRbClick(View view) {
        if (mHomeFragment == null) {
            mHomeFragment = new HomeFragment();
        }
        Log.d(TAG, "view:" + view); // 拿到 具体点击的view对象。
        mFragmentHelper.switchFragment(mHomeFragment);
    }

    @OnClick(R.id.find_rb)
    private void findRbClick(View view) {
        if (mFindFragment == null) {
            mFindFragment = new FindFragment();
        }
        Log.d(TAG, "view:" + view);
        mFragmentHelper.switchFragment(mFindFragment);
    }

    @OnClick(R.id.new_rb)
    private void newRbClick() {
        if (mNewFragment == null) {
            mNewFragment = new NewFragment();
        }
        mFragmentHelper.switchFragment(mNewFragment);
    }

    @OnClick(R.id.message_rb)
    private void messageRbClick() {
        if (mMessageFragment == null) {
            mMessageFragment = new MessageFragment();
        }
        mFragmentHelper.switchFragment(mMessageFragment);
    }
    //endregion


    @Override
    protected void initData() {
    }

    @Override
    protected void initView() {
        initDefaultTab();
    }

    @Override
    protected void initTitle() {
        DefaultNavigationBar navigationBar = new DefaultNavigationBar
                .Builder(this)
                .setTitleBackgroundColor(Color.parseColor("#FF00ff"))
//                .setTitleBackgroundColor(R.color.orange)
                .setTitle("首页")
                .setRightText("发表")
                .hideLeftIcon() // 隐藏左边按钮。
                .setRightClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        startActivity(TestActivity.class);
                    }
                })
                .builder();
    }

    @Override
    protected void setContentView() {
        setContentView(R.layout.activity_main);
    }

    public void jumpTestPage(View view) {
        // 跳转到自己。
        Intent intent = new Intent(this, TestActivity.class);
        startActivity(intent);
    }


    // 双进程守护
    private void appServiceGuard() {
        // 双进程
        startService(new Intent(this, MessageService.class));
        startService(new Intent(this, GuardService.class));
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            // 做5.0的判断
            startService(new Intent(this, JobWakeUpService.class));
        }
    }

    //region 换肤测试1
    public void skin(View view) {
        // TODO 从服务器下载red.skin皮肤，皮肤apk本地路径。拿到插件皮肤的path。
        String skinPath = Environment.getExternalStorageDirectory().getAbsolutePath()
                + File.separator + "red.skin";
        // 返回换肤的结果：成功/失败
        int result = SkinManager.getInstance().loadSkin(skinPath);
        Log.e(TAG, "loadSkin result: " + result);
    }

    public void skin1(View view) {
        // 恢复默认
        SkinManager.getInstance().restoreDefault();
    }

    public void skin2(View view) {
        // 跳转
        startActivity(MainActivity.class);
    }

    @Override
    public void changeSkin(SkinResource skinResource) {
        // TODO UI使用了第三方的组件，做一些第三方的改变。skinResource是当前使用的皮肤。去里面获取颜色图片等。
        Log.e(TAG, "changeSkin: in MainActivity " + skinResource.getCurrentPackageName());
    }
    //endregion

    //region 更换皮肤测试0: 基础使用
    // 更换皮肤测试
    private void testSkin() {
        ImageView imageIv = findViewById(R.id.iv_image);
        findViewById(R.id.tv_text).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    // 读取本地 .skin中的资源。
                    Resources superRes = getResources();
                    AssetManager asset = AssetManager.class.newInstance();
                    // 添加本地已经下载好的皮肤资源
                    Method method = AssetManager.class.getDeclaredMethod("addAssetPath", String.class);
                    method.setAccessible(true);
                    String resPath = Environment.getExternalStorageDirectory().getAbsolutePath()
                            + File.separator + "red.skin";
                    method.invoke(asset, resPath); // 反射执行方法
                    Resources resources = new Resources(asset, superRes.getDisplayMetrics(), superRes.getConfiguration());

                    // 获取资源id: 根据名字取拿
                    int drawableId = resources.getIdentifier("image_src", "drawable", "com.hc.skin");
                    Drawable drawable = resources.getDrawable(drawableId);
                    imageIv.setImageDrawable(drawable); // 替换图片
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    //endregion

    //region 测试数据库， sqlite Editor 可查看具体的数据库。
    /**
     * 1.为什么用Factory，目前数据库在内存卡中，获取不同Factory写入的位置就不同。
     * 2.面向接口编程：后去的IDaoSupport，不需要关心实现，方便以后使用第三方的。
     * 3.就是为了高扩展。
     * 返回的是接口，只需要调用接口的方法即可。具体的实现在DaoSupport 里面。
     * 面向对象的最少支持原则，只管拿，里面具体怎么实现的不管。
     */
    private void testDb() {
        // 通过Factory，插入对象。通过Factory，能达到最少支持原则。
        IDaoSupport<Person> daoSupport = DaoSupportFactory.getFactory().getDao(Person.class);
        // 面向对象的最少支持原则，只管拿，里面是怎么实现的可以不管。
//        daoSupport.insert(new Person("tom", 22));
        List<Person> persons = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            persons.add(new Person("person" + i, 22 + i));
        }
        daoSupport.insert(persons);
    }


    /**
     * 自定义的修复方式：dex插入到列表的最前面。
     */
    private void fixDexBug() {
        // fix.dex 已修复apk中的 dex包。存放在手机卡根目录中。
        // 修复过一次，dex文件就被拷贝到mDexDir目录去了。就会走BaseApplication中的流程去修复。
        File fixFile = new File(Environment.getExternalStorageDirectory(), "fix.dex");
        if (fixFile.exists()) {
            try {
                FixDexManager fixDexManager = new FixDexManager(this);
                fixDexManager.fixDex(fixFile.getAbsolutePath());
                Toast.makeText(this, "修复成功！", Toast.LENGTH_SHORT).show();
            } catch (Exception exception) {
                exception.printStackTrace();
                Toast.makeText(this, "修复失败", Toast.LENGTH_SHORT).show();
            }
        }
    }


    private void testHttp() {
        // 路径、参数，后期可以放在jni里面-> .so库，防止app被反编译。通过jni获取。让别人拿不到路径。
        HttpUtils.with(this)
                .url("https://is.snssdk.com/2/essay/discovery/v3/?")
//                .addParam("iid", "6152551759")
//                .addParam("aid", "7")
                .exchangeEngine(new OkHttpEngine()) // 切换引擎
                .cache(true)
//                .tag(this)
                .execute(new HttpCallback<DiscoverListResult>() { // 带泛型，泛型解析
                    @Override
                    public void onPrepareExecute() {
                        // 显示进度条，可以不复写这个方法
                    }

                    @Override
                    public void onError(Exception e) {
                    }

                    @Override
                    public void onSuccess(DiscoverListResult result) {
                        // 取消进度条
                        // 需要转换成可 直接操作的Bean
                        // 成功的回调方法，某些接口需要缓存，自己带标识。
//                        Log.e(TAG, "onSuccess: " + result.getData().getCategories().getName());
                    }
                });
    }


    private void testNavigationBar() {
        // 初始化头部
        DefaultNavigationBar navigationBar = new DefaultNavigationBar
                .Builder(this)
//                .setTitleBackgroundColor(Color.parseColor("#FF00ff"))
//                .setTitleBackgroundColor(R.color.orange)
                .setTitle("投稿")
                .setRightText("发表")
                .hideLeftIcon() // 隐藏左边按钮。
                .setRightClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        startActivity(SelectImageActivity.class);
                    }
                })
                .builder();
    }

    private void testMyDialog() {
        AlertDialog dialog = new AlertDialog.Builder(this)
                .setContentView(R.layout.dialog_comment_dialog)
                .setText(R.id.btn_go, "提交按钮--")
                .fromBottom(true).fullWidth()
                .show();
        // dialog的点击事件
        final EditText commentEt = dialog.getView(R.id.et_input);
        commentEt.setHint("请文明评论~~");
        // 弹框中，如果有ListView，RecyclerView，CheckBox等特有的对象，要用getView方法，先得到对象。然后再做操作。
        dialog.setOnClickListener(R.id.account_icon_weibo, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String input = commentEt.getText().toString();
                Toast.makeText(MainActivity.this, "click weibo:" + input, Toast.LENGTH_LONG).show();
            }
        });
    }

    // 阿里的AndFix 方案，热修复。
    private void aliFixBug() {
        File fixFile = new File(Environment.getExternalStorageDirectory(), "fix.apatch");
        if (fixFile.exists()) {
            // 文件已存在，修复bug
            try {
                // 立即修复生效，不需要重启app
//                BaseApplication.mPatchManager.addPatch(fixFile.getAbsolutePath());
//                Toast.makeText(this, "修复成功！", Toast.LENGTH_SHORT).show();
                // 成功了，弹出Toast，修复成功。
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(this, "修复失败", Toast.LENGTH_SHORT).show();
            }
        }
    }

    private void uploadCrashLog() {
        //        int i = 2 / 0;
        // 获取上次的崩溃信息，上传到服务器
        File crashFile = ExceptionCrashHandler.getInstance().getCrashFile();
        if (crashFile.exists()) {
            // 上传。
            try {
                // 读取crash文件中内容，拼装成string，上传
                InputStreamReader fileReader = new InputStreamReader(new FileInputStream(crashFile));
                char[] buffer = new char[1024]; // 每次读取1024
                int len = 0;
                while ((len = fileReader.read(buffer)) != -1) {
                    String str = new String(buffer, 0, len);
                    Log.d("---tag---", str);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


    //endregion


}




